import { createRouter, createWebHistory } from 'vue-router'

const mdFiles = import.meta.glob('@docs/**/*.md')

const mdRoutes = Object.keys(mdFiles)
  .map((file) => {
    // file 例如: '@docs/index.md' 或 '@docs/pages/basic.md'
    let path = file
      .replace(/^@docs/, '') // 去掉 @docs
      .replace(/\.md$/, '') // 去掉 .md 后缀
      .replace(/\/index$/, '/') // /xx/index.md -> /xx/

    // 首页特殊处理
    if (path === '/index') path = '/'

    // 为非首页的markdown文件路径添加/docs/前缀
    if (path !== '/' && !path.startsWith('/docs/')) {
      path = `/docs${path}`
    }

    // 使用原始路径和编码路径
    const routePath = path
    const encodedPath = encodeURI(path)

    // 返回两个路由配置，一个处理原始路径，一个处理编码路径
    return [
      {
        path: routePath,
        name: path === '/' ? 'md-home' : `md${path.replace(/\//g, '-')}`,
        component: mdFiles[file],
      },
      {
        path: encodedPath,
        name: path === '/' ? 'md-home-encoded' : `md${path.replace(/\//g, '-')}-encoded`,
        component: mdFiles[file],
      },
    ]
  })
  .flat() // 使用flat()将二维数组转为一维数组

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import('@/views/HomePage.vue'),
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('@/views/AboutPage.vue'),
    },
    ...mdRoutes,
  ],
  // 添加滚动行为控制
  scrollBehavior(to, from, savedPosition) {
    // 如果是浏览器的前进/后退按钮，使用保存的位置
    if (savedPosition) {
      return savedPosition
    }

    // 如果只是哈希变化（锚点导航），不滚动到顶部
    if (to.path === from.path && to.hash) {
      // 返回false表示不改变滚动位置
      return false
    }

    // 对于其他导航，滚动到顶部
    return { top: 0 }
  },
})

// 添加全局前置守卫，处理编码后的路径

router.beforeEach((to, from, next) => {
  // 如果路径是编码路径（名称以-encoded结尾），则重定向到对应的原始路径
  if (to.name && typeof to.name === 'string' && to.name.endsWith('-encoded')) {
    // 获取原始路径名称
    const originalName = to.name.replace('-encoded', '')
    // 查找对应的原始路径
    const originalRoute = router.getRoutes().find((route) => route.name === originalName)
    if (originalRoute) {
      next({ path: originalRoute.path, replace: true })
      return
    }
  }
  next()
})

export default router
export { mdRoutes }
